Log4j2基础和Springboot整合

您所在的位置:网站首页 log4j2 yml配置 Log4j2基础和Springboot整合

Log4j2基础和Springboot整合

#Log4j2基础和Springboot整合 | 来源: 网络整理| 查看: 265

目录

Log4j2概述

Log4j2的同步和异步日志配置

Springboot整合Log4j2 a. 依赖

b. 配置文件

c. log4j2.xml文件

d. Demo逻辑

e. 测试结果

整合TLog实现trace跟踪

整合TLog实现接口调用参数和耗时打印

参考

https://mp.weixin.qq.com/s/vCixKVXys5nTTcQQnzrs3w https://www.cnblogs.com/yeyang/p/7944906.html https://www.cnblogs.com/keeya/p/10101547.html Log4j2概述日志门面

门面模式(Facade Pattern),也称之为外观模式,其核心为:外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用。

门面模式

就像前面介绍的几种日志框架一样,每一种日志框架都有自己单独的API,要使用对应的框架就要使用其对应的API,这就大大的增加应用程序代码对于日志框架的耦合性。

为了解决这个问题,就是在日志框架和应用程序之间架设一个沟通的桥梁,对于应用程序来说,无论底层的日志框架如何变,都不需要有任何感知。只要门面服务做的足够好,随意换另外一个日志框架,应用程序不需要修改任意一行代码,就可以直接上线。

在软件开发领域有这样一句话:计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。而门面模式就是对于这句话的典型实践。

为什么选用log4j2

相比与其他的日志系统,log4j2丢数据这种情况少;disruptor技术,在多线程环境下,性能高于logback等10倍以上;利用jdk1.5并发的特性,减少了死锁的发生;

在这列举一下一些网上其他博文中对它们的性能评测:

Log4j2性能

可以看到在同步日志模式下, Logback的性能是最糟糕的. log4j2的性能无论在同步日志模式还是异步日志模式下都是最佳的. Log4j2的同步和异步日志配置

Log4j 2中记录日志的方式有同步日志和异步日志两种方式,其中异步日志又可分为使用AsyncAppender和使用AsyncLogger两种方式。

详细解释和原理参考文档:https://www.cnblogs.com/yeyang/p/7944906.html

所谓同步日志,即当输出日志时,必须等待日志输出语句执行完毕后,才能执行后面的业务逻辑语句。Log4j2的同步和异步日志配置

%d %p %c{1.} [%t] %m%n

Log4j2中的异步日志实现方式有AsyncAppender和AsyncLogger两种。

其中,AsyncAppender采用了ArrayBlockingQueue来保存需要异步输出的日志事件;AsyncLogger则使用了Disruptor框架来实现高吞吐。

AsyncAppender模式

%d %p %c{1.} [%t] %m%n

AsyncLogger模式

%d %p %c{1.} [%t] %m%n %d %p %c{1.} [%t] %m%n Springboot整合Log4j2依赖 org.springframework.boot spring-boot-starter-parent 2.5.14 8 8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-logging org.springframework.boot spring-boot-starter-test junit junit 4.9 org.springframework.boot spring-boot-starter-log4j2 com.lmax disruptor 3.4.4 commons-lang commons-lang 2.6 com.alibaba fastjson 1.2.30 配置文件server: port: 8080 servlet: context-path: / logging: config: classpath:log4j2.xml Log4j2.xml配置文件 Demo逻辑public class User implements Serializable { private static final long serialVersionUID = -7351729135012380019L; private String name; private int age; public User() { } public User(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); } } @Component public class UserRepository { private static final Logger logger = LoggerFactory.getLogger(UserRepository.class); /** * 返回用户信息 * @param name * @return */ public User getUserByName(String name){ logger.info("查询{}用户信息", name); return new User(name, 28); } } @Service public class UserService { private static final Logger logger = LoggerFactory.getLogger(UserService.class); @Autowired private UserRepository userRepository; /** * 查询用户信息 * @param name * @return */ public User queryUser(String name){ logger.info("查询{}用户信息", name); return userRepository.getUserByName(name); } } @RestController public class UserController { private static final Logger logger = LoggerFactory.getLogger(UserController.class); private static final Logger digest = LoggerFactory.getLogger("DIGEST"); @Autowired private UserService userService; @RequestMapping("/user") public String getUser(String name) { logger.info("UserController.class 收到{}用户请求", name); try { String res = userService.queryUser(name).toString(); digest.info("请求{}用户信息: {}", name, res); return res; } catch (Exception e) { logger.info("请求{}用户信息错误", name, e); return StringUtils.EMPTY; } } } @SpringBootApplication public class Log4j2App { public static void main(String[] args) { SpringApplication.run(Log4j2App.class, args); } } 测试结果

整合TLog实现trace跟踪

TLog介绍和使用的官网文档:https://tlog.yomahub.com/pages/5b7bd2/

在上述Demo中做整合

pom添加TLog依赖。注意TLog要在Log4j2前导入

com.yomahub tlog-all-spring-boot-starter 1.5.0 commons-lang commons-lang fastjson com.alibaba

log4j2.xml文件修改。%TX{tl}为TLog标签,%m替换为%tm

运行效果

整合TLog实现接口调用参数和耗时打印

在application.yml中添加配置

# TLog配置 tlog: # 自动打印接口调用参数和耗时 enable-invoke-time-print: true

测试结果



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3